<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>

  <script>
    /*
      数组常用方法3
        1. flat()
          => 语法: 数组.flat(数字)
            -> 如果不传递参数, 默认拍平一层
            -> 传递的数字是几, 就拍平多少层
            -> 不管多少维度都直接拍平, Infinity
          => 作用: 拍平一个数组(把多维转换成一维)

        2. find()
          => 语法: 数组.find(function (item, index, arr) {})
          => 返回值: 数组中满足条件的第一个
            -> 以 return 的形式书写条件

        3. findIndex()
          => 语法: 数组.findIndex(function (item, index, arr) {})
          => 返回值: 数组中满足条件的第一个的索引位置
            -> 以 return 的形式书写条件

        4. includes()
          => 语法: 数组.includes(数据)
          => 返回值: 一个布尔值
            -> 如果数组内有改数据, 那么就是 true
            -> 如果数组内没有该数据, 那么就是 false

        5. fill()
          => 语法: 数组.fill(要填充的数据, 开始索引, 结束索引)
            -> 开始索引不写默认是 0
            -> 结束索引不写, 默认是最后一位的索引
            -> 特点: 索引 包前不包后(包含开始索引, 不包含结束索引)
          => 作用: 替换, 按照索引位置替换数组内指定索引的数据
            -> 等价于 arr[2] = '你好 世界'
          => 注意: 直接改变原始数组
          => 注意: 只能替换现有数据, 不能新增

        6. reduce()
          => 语法: 数组.reduce(function (prev, item, index, arr) {}, init)
            -> init 如果不写, 默认使用数组中的第一个数据
          => 作用: 叠加
          => 返回值: 就是叠加后的结果
    */

    // 1. flat
    // var arr = [10, [20, 30, [40, 50, [60, 70, [80, [90]]]]]]
    // var res = arr.flat(Infinity)
    // console.log(arr)
    // console.log(res)

    // 2. find()
    // var arr = [ 10, 20, 30, 40, 50, 60 ]
    // var res = arr.find(function (item) {
    //   return item % 3 === 0
    // })
    // console.log(res)

    // 3. findIndex()
    // var arr = [ 10, 20, 30, 40, 50, 60 ]
    // var res = arr.findIndex(function (item) {
    //   return item % 3 === 0
    // })
    // console.log(res)

    // 4. includes()
    // var arr = [ 10, 20, 30, 40, 50, 60 ]
    // var res = arr.includes(33)
    // console.log(res)

    // 5. fill()
    // var arr = [ 10, 20, 30, 40, 50, 60 ]
    // console.log('原始数组 : ', arr)
    // arr.fill('新来的')
    // 从 [2] 开始到 [5] 结束, 包含 [2] 不包含 [5]
    // arr.fill('新来的', 2, 5)
    // arr.fill('新来的', 2)
    // arr.fill('新来的', 2, 100)
    // console.log('原始数组 : ', arr)

    // 6. reduce()
    var arr = [ 10, 20, 30, 40, 50, 60 ]
    var res = arr.reduce(function (prev, item) {
      console.log(prev, item)
      return prev + item
    }, 100)
    console.log('最终结果: ', res)

    /*
      你设置了 init 位置参数
        循环第一次, prev 就是 init 位置的值, item 就是数组内的第一项
        循环第二次, prev 就是上一次 return 的内容, item 是数组当前第二项

      你没有设置 init 位置参数
        此时, 会默认使用数组中的 [0] 这一项当做 init 位置参数
        循环第一次, prev 就是数组 [0] 的值, item 就是索引当前项 [1]
        如果没有 init 位置的数据, 那么数组从 [1] 开始遍历
    */
  </script>
</body>
</html>
